# 读取输入的二维数组，并计算从顶部到底部的最大路径和
def main():
    n = int(input())  # 输入二维数组的行数
    a = [[0] * (n + 1) for _ in range(n + 1)]  # 初始化二维数组a
    dp = [[0] * (n + 1) for _ in range(n + 1)]  # 初始化动态规划数组dp

    # 输入二维数组a的值
    for i in range(1, n + 1):
        row = list(map(int, input().split()))
        for j in range(1, i + 1):
            a[i][j] = row[j - 1]

    dp[1][1] = a[1][1]  # 初始化dp数组的第一个值

    # 动态规划计算最大路径和
    for i in range(2, n + 1):
        for j in range(1, i + 1):
            dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + a[i][j]

    # 找到最后一行的最大值，即为最大路径和
    ans = max(dp[n])
    print(ans)

if __name__ == "__main__":
    main()